﻿Imports DevExpress.XtraVerticalGrid

Public Class IVGridView
    Inherits VGridControl

    'Dim dataTable As DataTable
    'Dim binding As BindingSource
    'Dim adapter As Object
    'Dim dataset As DataSet

    ' ''' <summary>
    ' ''' Thêm các đối tượng cần xử lý đối với dữ liệu 
    ' ''' </summary>
    ' ''' <param name="dt">DataTable</param>
    ' ''' <param name="binding">BindingSource</param>
    ' ''' <param name="adapter">TableAdapter</param>
    ' ''' <param name="dataset">DataSet</param>
    ' ''' <remarks></remarks>
    'Public Sub setDoiTuongXuLyDuLieu(ByVal binding As BindingSource, ByVal adapter As Object, ByVal dataset As DataSet, ByVal dt As DataTable)
    '    Me.dataTable = dt
    '    Me.binding = binding
    '    Me.adapter = adapter
    '    Me.dataset = dataset
    'End Sub

    ''' <summary>
    ''' set lại trên lưới trạng thái readonly
    ''' </summary>
    ''' <param name="isTrue"> true thì không cho chỉnh sửa trên lưới - false thì cho </param>
    ''' <remarks></remarks>
    Public Sub setReadonly(ByVal isTrue As Boolean)
        If isTrue Then
            Me.OptionsBehavior.Editable = False
        Else
            Me.OptionsBehavior.Editable = True
        End If

    End Sub

    ' ''' <summary>
    ' ''' hàm tạo mới 1 dòng dữ liệu trên grid
    ' ''' </summary>
    ' ''' <returns>true nếu tạo được</returns>
    ' ''' <remarks>false nếu không tạo được</remarks>
    'Public Function getTaoMoi() As Boolean
    '    Try
    '        Me.OptionsBehavior.Editable = True
    '        Me.AddNewRecord()
    '        Me.FocusFirst()
    '    Catch ex As Exception
    '        Return False
    '    End Try
    '    Return True
    'End Function

    'Public Function getCoThayDoiDuLieuKhong() As Boolean
    '    Try
    '        Me.binding.EndEdit()
    '    Catch ex As Exception

    '    End Try
    '    If Me.dataset.HasChanges Then
    '        Return True
    '    Else
    '        Return False
    '    End If
    'End Function
    ' ''' <summary>
    ' ''' Hàm update dữ liệu ngầm (không thông báo lên cho người sử dụng thấy)
    ' ''' </summary>
    ' ''' <returns>Nếu thành công trả về true - ngược lại false</returns>
    ' ''' <remarks></remarks>
    'Public Function getLuuNgam() As Boolean
    '    Me.Cursor = Cursors.WaitCursor
    '    Try
    '        Me.binding.EndEdit()
    '    Catch ex As Exception
    '        'MessageBox.Show(ex.Message)
    '        Me.binding.CancelEdit()
    '        'Me.Cursor = Cursors.Default
    '        'Return False
    '    End Try

    '    If dataset.HasChanges Then ' DataSet sẽ coi các dữ liệu có thay đổi hay chưa (có : true,không : false)
    '        Try
    '            'binding.EndEdit()
    '            adapter.Update(dataTable)
    '            Me.Cursor = Cursors.Default
    '            Return True
    '        Catch ex As Exception
    '            'sửa thông báo lỗi = dev
    '            DevExpress.XtraEditors.XtraMessageBox.Show("lỗi 'Lưu ngầm' :" & ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error)
    '            Me.Cursor = Cursors.Default
    '            Return False
    '        End Try
    '    Else
    '        Me.Cursor = Cursors.Default
    '        Return False 'không sửa ngầm
    '    End If
    'End Function
    ' ''' <summary>
    ' ''' Làm tươi dữ liệu iultragrid
    ' ''' </summary>
    ' ''' <returns></returns>
    ' ''' <remarks></remarks>
    'Public Function getLamTuoi() As Boolean
    '    Me.Cursor = Cursors.WaitCursor
    '    Try
    '        Dim position As Integer = Me.binding.Position
    '        Me.adapter.fill(Me.dataTable)
    '        Me.binding.Position = position
    '    Catch ex As Exception
    '        Me.Cursor = Cursors.Default
    '        Return False
    '    End Try
    '    Me.Cursor = Cursors.Default
    '    Return True
    'End Function
    ' ''' <summary>
    ' ''' Hàm lưu trong 1 iultragrid
    ' ''' </summary>
    ' ''' <returns>Nếu thành công sẽ trả về true - ngược lại false</returns>
    ' ''' <remarks></remarks>
    'Public Function getLuu() As Boolean
    '    Me.Cursor = Cursors.WaitCursor
    '    Try
    '        Me.binding.EndEdit()
    '    Catch ex As Exception
    '        'MessageBox.Show(ex.Message)
    '        Me.binding.CancelEdit()
    '        'Me.Cursor = Cursors.Default
    '        'Return False
    '    End Try
    '    If dataset.HasChanges Then ' DataSet sẽ coi các dữ liệu có thay đổi hay chưa (có : true,không : false)
    '        'If MessageBox.Show("Bạn có muốn 'Lưu' không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = MsgBoxResult.Yes Then
    '        If DevExpress.XtraEditors.XtraMessageBox.Show("Bạn có muốn 'Lưu' không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = MsgBoxResult.Yes Then
    '            Try
    '                'Dim position As Integer = bindsource.position
    '                'binding.EndEdit()
    '                adapter.Update(dataTable)
    '                Me.Cursor = Cursors.Default
    '                'neu luu thanh cong
    '                'Me.setReadonly(True)
    '                Return True
    '            Catch ex As Exception
    '                'If ex.Message.ToString.Contains("unique") Then
    '                '    MessageBox.Show("'Mã' đã tồn tại , bạn phải chọn 'Mã' khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
    '                'Else
    '                DevExpress.XtraEditors.XtraMessageBox.Show("lỗi lưu :" & ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error)
    '                'MessageBox.Show("lỗi lưu :" & ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error)
    '                'End If
    '                Me.Cursor = Cursors.Default
    '                Return False
    '            End Try
    '        Else 'nếu không chịu sửa (user bấm no khi chương trình hỏi yes/no thì bỏ đi những thay đổi)
    '            'bindsource.ResetCurrentItem()
    '            'bindsource.CancelEdit()
    '            dataset.RejectChanges()
    '            Me.Cursor = Cursors.Default
    '            Return True
    '        End If
    '    Else
    '        'hiển thị thông báo này khi user click sửa mà chưa sửa gì trên form
    '        DevExpress.XtraEditors.XtraMessageBox.Show("Chưa có thông tin để 'Lưu'!!!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information)
    '        Me.Cursor = Cursors.Default
    '        Return False
    '    End If
    'End Function
    'Protected Overrides Function CreateHandler() As DevExpress.XtraVerticalGrid.BaseHandler
    '    Return New MyVGridHandler(Me)
    'End Function

    Private Sub InitializeComponent()
        CType(Me, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'IVGridView
        '
        Me.LayoutStyle = DevExpress.XtraVerticalGrid.LayoutViewStyle.BandsView
        Me.OptionsBehavior.UseEnterAsTab = True
        Me.OptionsView.AutoScaleBands = True
        CType(Me, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
End Class

Public Class MyVGridHandler
    Inherits BaseHandler

    Sub New(ByVal Owner As VGridControlBase)
        MyBase.New(Owner)
    End Sub

    Protected Overrides Function CreateState(ByVal state As DevExpress.XtraVerticalGrid.VGridState) As DevExpress.XtraVerticalGrid.ControlState
        If state = VGridState.Regular Then
            Return New MyVGridRegularState(Me)
        ElseIf state = VGridState.Editing Then
            Return New MyVGridEditingState(Me)
        End If
        Return MyBase.CreateState(state)
    End Function
End Class

Public Class MyVGridRegularState
    Inherits RegularState

    Sub New(ByVal Owner As BaseHandler)
        MyBase.New(Owner)
    End Sub

    Public Overrides Sub KeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Tab OrElse e.KeyCode = Keys.Enter Then
            If e.Shift Then
                If Grid.FocusedRow.Equals(Grid.GetFirstVisible) Then
                    CType(Grid.Parent, ContainerControl).SelectNextControl(Grid, False, True, True, True)
                    Return
                End If
            Else
                If Grid.FocusedRow.Equals(Grid.GetLastVisible) Then
                    CType(Grid.Parent, ContainerControl).SelectNextControl(Grid, True, True, True, True)
                    Return
                End If
            End If
        End If

        MyBase.KeyDown(e)
    End Sub
End Class

Public Class MyVGridEditingState
    Inherits EditingState

    Sub New(ByVal Owner As BaseHandler)
        MyBase.New(Owner)
    End Sub

    Public Overrides Sub KeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Tab OrElse e.KeyCode = Keys.Enter Then
            If e.Shift Then
                If Grid.FocusedRow.Equals(Grid.GetFirstVisible) Then
                    Grid.CloseEditor()
                    CType(Grid.Parent, ContainerControl).SelectNextControl(Grid, False, True, True, True)
                    Return
                End If
            Else
                If Grid.FocusedRow.Equals(Grid.GetLastVisible) Then
                    Grid.CloseEditor()
                    CType(Grid.Parent, ContainerControl).SelectNextControl(Grid, True, True, True, True)
                    Return
                End If
            End If
        End If

        MyBase.KeyDown(e)
    End Sub
End Class


